// 枚举支持的RESTFUL接口种类
enum SupportMethods { GET, POST, DELETE }

// 基本请求抽象类
// 支持请求格式：
// curl -X GET "http://api.devio.org/uapi/test/test?requestPrams=11" -H "accept: */*"
// curl -X GET "https://api.devio.org/uapi/test/test/1
abstract class BaseRequest {
  String domain = "api.devio.org"; // 默认请求id
  bool get isHttps; // 需要重写是否使用Https
  bool get needLogin; // 需要重写是否需要登陆
  String get route; // 需要重写的路由目录
  SupportMethods get method; // 需要重写的请求方法
  String get path; // 请求路径
  Map<String, dynamic> queryParams = {}; // 请求参数
  Map<String, dynamic> header = {}; // 请求头

  // 设置请求参数
  BaseRequest setQueryParams(dynamic value, [String key]) {
    _setMap(queryParams, key, value);
    return this;
  }

  // 设置请求头
  BaseRequest setHeader(dynamic value, [String key]) {
    _setMap(header, key, value);
    return this;
  }

  // 设置Map数据类型
  void _setMap(Map<String, dynamic> map, String key, dynamic value) {
    final v = value.toString();
    if (v == null) {
      debugWarn('传入的value值为空');
      return;
    }
    map[key] = v;
  }

  // 设置默认请求域名
  BaseRequest setDomain(String newDomain) {
    domain = newDomain;
    return this;
  }

  // debug提示
  void debugWarn(String situation) {
    print("$situation: ${StackTrace.current}");
  }

  // 取得请求路径
  String get url {
    if (path.isEmpty) {
      // 如果路径为空则打印当前堆栈信息
      debugWarn("当前的请求路径为空");
    }
    String totalPath = path;
    if (route.isNotEmpty) {
      // 如果路由页不为空则需要拼入总字符串
      totalPath = "/$route/$totalPath";
    }
    String url = isHttps
        ? Uri.https(
                domain, totalPath, queryParams.isNotEmpty ? queryParams : null)
            .toString()
        : Uri.http(
                domain, totalPath, queryParams.isNotEmpty ? queryParams : null)
            .toString();
    return url;
  }
}
